
package hauptklassen;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import objekte.Player;

import listener.MyKeyListener;
import listener.MyMouseListener;

public class Main extends JFrame implements Runnable{
	
	private static final long serialVersionUID = 1L;

	public static Main m;//das Hauptklassenobjekt
	
	Thread th;
	
	long wt = System.currentTimeMillis();//time until next tick begins
	final long FPS = 15;//how many ticks per second
	
	public static final String[] Colors = {"schwarz"};//verfuegbare Farben des Autos
	public int Streifenzahl = 3;//Anzahl der Fahrspuren
	public boolean ingame = false;//tells weather ingame or not
	public boolean pause = false;//true if game is paused
	public boolean testmode = true;//debug-mode
	
	public Startscreen ssc;//the startscreen
	public Strasse str;//Die Strasse
	public Zivilkontrolle zk;
	
	MyKeyListener kl = new MyKeyListener();//Keylistener
	MyMouseListener ml = new MyMouseListener();//MouseListener

	public Player player;//der Spieler

	private Image dbImage;
	private Graphics dbGraphics;
	/**
	 * Methode die beim Programmstart aufgerufen wird
	 * @param args
	 */
	public static void main(String[] args){
		m = new Main();
		m.startSimu();
	}
//	@Override
	public void update(Graphics g)
	{
	   //Double-Buffer initialisieren
	   if (dbImage == null) {
	      dbImage = createImage(this.getWidth(),this.getHeight());
	      dbGraphics = dbImage.getGraphics();
	   }
	   //Vordergrund zeichnen
	   paint(dbGraphics);
	   //Offscreen anzeigen
	   g.drawImage(dbImage,0,0,this);
	}
	/**
	 * initiallisiert das Objekt main
	 */
	public Main(){
		//Wenn das Fenster geschlossen wird Programm beenden
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				m.setVisible(false);
				m.dispose();
				System.exit(0);
			}
			
		});
		//Listener hinzufuegen
		this.addMouseListener(ml);
		this.addKeyListener(kl);

		this.pack();
		this.setLocation(0,0);
		this.setSize(500, 500);
		this.setResizable(false);
		this.setVisible(true);
		this.setResizable(false);
		this.ssc = new Startscreen();//Den Startbildschirm erstellen
	}
	/**
	 * organisiert den Programmablauf
	 */
	public void run() {
		while (true) {
			if (!pause){//wenn das Spiel nicht Pausiert ist, werden die Objekte aktualisiert
				calculate();
			}
			repaint();//neu malen
			try{
				while (System.currentTimeMillis()<wt){//FPS-Kontrolle
					if (pause){
						Thread.sleep(5);
					}
					Thread.sleep(1);
				}
				wt = System.currentTimeMillis()+1000/FPS;
			}catch (Exception x){
				JOptionPane.showMessageDialog(null, "Fehler");
				x.printStackTrace();
			}
		}
	}
	/**
	 * Steuert den rechenablauf
	 */
	private void calculate() {
		if (ingame&&!pause){
			m.str.update();
			m.player.update();
			m.zk.update();
		}
	}
	/**
	 * Startet die Simulation
	 */
	private void startSimu() {
		th = new Thread(this);
		th.start();
	}
	/**
	 * steuert den Zeichenablauf
	 */
	public void paint(Graphics g){
		if (!ingame&&!pause){//wenn das Spiel nicht gestartet und nicht pausiert ist wird der Startscreen animiert
			m.ssc.animation(g);//TODO wo ist der Fehler?
		}
		if (pause){//Wenn Pausiert ist wird der Pausebildschirm animiert
			Font test = new Font("Arial",Font.BOLD,30);
			g.setColor(m.getBackground());
			g.fillRect(0, 0, m.getWidth(), m.getHeight());
			g.setColor(Color.black);
			g.setFont(test);
			g.drawString("Pause", (int)(Main.m.getWidth()/2-2.5*20), 250);
		}
		if (ingame&&!pause){//während dem Spiel wird der aktuelle Zustand gezeichnet
			m.str.draw(g);
			m.player.draw(g);
			m.zk.draw(g);
		}
	}
	/**
	 * pausiert das Spiel
	 */
	public void pauseGame() {
		m.pause = true;
		m.ingame = false;
	}
	/**
	 * 
	 */
	public void continueGame(){
		m.pause = false;
		m.ingame = true;
	}
	/**
	 * startet das Spiel
	 */
	public void startGame() {
		System.out.println("game started");
		m.setSize(Streifenzahl*120, 500);
		m.str = new Strasse();
		m.player = new Player();
		m.zk = new Zivilkontrolle();
		m.ingame = true;
	}
	public void endGame() {
		ingame = false;
		pause = true;
		
		
	}
}
